package com.hunttown.mes.service;

import com.hunttown.mes.common.cache.Cache;
import com.hunttown.mes.common.keys.KeyConstants;
import com.hunttown.mes.common.utils.CookieUtils;
import com.hunttown.mes.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * @title: 帮助小工具
 * @author: wangjunfu
 * @date: 2021年02月27日 10:28
 * @description: 获取企业ID
 */
@Service
public class AHelpService {
    private final static Logger logger = LoggerFactory.getLogger(AHelpService.class);

    private final HttpServletRequest request;
    private final Cache jedisCache;

    @Autowired
    public AHelpService(HttpServletRequest request, Cache jedisCache) {
        this.request = request;
        this.jedisCache = jedisCache;
    }

    //直接返回entid=1的站点
    private List<String> wwwStationList() {
        List<String> list = new ArrayList<>();
        list.add("www.lightfoot.cn");   //【光明足迹】
        list.add("www.cnkeyun.cn");     //【CN客运】
        return list;
    }

    //* *** 企业ID ***
    //* 1、WWW站点：判断host是否是www开头，如果是，则直接返回entid=1（因为前端www站和后端manage站用的是一个AHelpService，而www站的entid就是1。如果后端业务站也用了www站，就得做排除。）；
    //* 2、WEB站点：先从cookie中获取pin，然后根据pin从缓存中获取entid；
    //* 3、API站点：如果不存在，则说明是api接口过来的，则从request中获取hear头参数中的EntID。
    public Integer getEnterpriseId() {
        int default_ent_id = -1;

        try {

            if (request == null) {
                return default_ent_id;
            }

            //region [1]. WWW站过来，直接返回固定值
            StringBuffer url = request.getRequestURL();
            String domain = url.substring(url.indexOf("//") + 2);
            domain = domain.substring(0, domain.indexOf("/"));
            System.out.println("-------------------- this domain is " + domain + " --------------------");

            //如有排除的www站点项目，请配置wwwStationList
            if (domain.toLowerCase().startsWith("www.") && !wwwStationList().contains(domain)) {
                int www_ent_id = 1;
                System.out.println("******************** WWW站点返回企业ID：" + www_ent_id + " ********************");
                return www_ent_id;
            }
            //endregion

            //region [2]. WEB站过来，从缓存中获取
            String pin = CookieUtils.getCookieByName(request, KeyConstants.ADMIN_COOKIE);
            String cache_ent_id = jedisCache.get(KeyConstants.WEBSITE_CURRENT_ENTERPRISE_ID + pin);
            if (StringUtils.isNotBlank(cache_ent_id)) {
                System.out.println("******************** 从缓存中获取到企业ID：" + cache_ent_id + " ********************");
                return Integer.parseInt(cache_ent_id);
            }
            //endregion

            //region [3]. API站过来，从header头中获取
            //说明：getHeader是获得HTTP头信息，getParameter是获得表单参数值。
            //A、旧版从[参数]中传递
            //B、新版从[请求头]中传递。
            String param_ent_id = request.getParameter("EntID");
            if (StringUtils.isNotBlank(param_ent_id)) {
                System.out.println(">>>>>>>>>>>>>>>>>>>> 从请参数中获取到企业ID：" + param_ent_id + " <<<<<<<<<<<<<<<<<<<<");
                return Integer.parseInt(param_ent_id);
            } else {
                param_ent_id = request.getHeader("entid");
            }

            if (StringUtils.isNotBlank(param_ent_id)) {
                System.out.println(">>>>>>>>>>>>>>>>>>>> 从请求头Header中获取到企业ID：" + param_ent_id + " <<<<<<<<<<<<<<<<<<<<");
                return Integer.parseInt(param_ent_id);
            }
            //endregion

        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("------------------------ 企业ID获取失败 ------------------------");
        }

        System.out.println("------------------------ 未获取到企业ID，返回默认值：" + default_ent_id + " ------------------------");
        return default_ent_id;
    }

    //如果使用TEST，则注释上面的内容
    //public Integer getEnterpriseId() {
    //    return 1;
    //}
}
